You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
offline-octopus/index.js

120 lines
4.4 KiB

2 years ago
// Load required modules
// note that for WebXR, e.g SpaSca, https is required, even if using own certifcate
// see how it's done for offline NAF
2 years ago
const http = require("http"); // http server core module
const path = require("path");
const express = require("express"); // web framework external module
const {execSync} = require('child_process');
2 years ago
// Get port or default to 8080
const port = process.env.PORT || 8082;
// Setup and configure Express http server.
const app = express();
app.use(express.static(path.resolve(__dirname, ".", "examples")));
2 years ago
const instructions = `
/home/deck/.ssh/
trusted context, i.e on closed WiFi and over https, still. could check as bearer
/home/deck/.ssh/config
could limit to known IP range or class e.g cat .ssh/config | grep 192.168.4. -C 3
could also re-add new entries rather than extend the format
2 years ago
/home/deck/.ssh/authorized_keys
/home/deck/.ssh/known_hosts
/home/deck/.ssh/id_rsa_steamdeck
2 years ago
/home/deck/.ssh/id_rsa_steamdeck.pub
/home/deck/server.locatedb
seems to be plain text with metadata
2 years ago
/home/deck/desktop.plocate.db
seems to be a specific format, binary or maybe compressed
both should be queriable via http with json output
2 years ago
ssh remarkable2 to get drawing preview
2 years ago
conversion should be done, if necessary, on device
for typed text
cat 43*.rm | sed "s/[^a-zA-z0-9 ]//g" | sed "s/[OT,EC]//g"
2 years ago
util functions
modify WiFi parameters, including AP if available
shutdown/reboot
`
app.get('/pwa', (req, res) => {
// for offline use on mobile or VR headset
// should try to sync back when devices connect back
// same when itself connects back to (Internet) own server e.g benetou.fr
// can be cascading or federatede or properly P2P
// responsive programming also, not "just" design
res.redirect('pwa/index.html')
})
const utilsCmd = {
'shutdown' : { cmd: 'shutdown -h now' },
'listprototypes': { cmd: 'ls', context: {cwd: '/home/deck/Prototypes'},
// more reliably path.join(__dirname,'')
format: res => res.toString().split('\n')
},
}
app.get('/exec', (req, res) => {
if (!req.query.cmdName){
res.json(utilsCmd)
} else {
let resultFromExecution = execSync(utilsCmd[req.query.cmdName].cmd, utilsCmd[req.query.cmdName].context)
let formatter = utilsCmd[req.query.cmdName].format
if (formatter) resultFromExecution = formatter(resultFromExecution)
res.json( resultFromExecution )
}
})
// app.get('/interface/unregister', (req, res) => {
// app.get('/interface/register', (req, res) => {
// could be use for e.g reMarkable2, Quest2, etc with specifically accepted or prefered formats
app.get('/services/unregister', (req, res) => {
res.json( {msg: 'not yet implemented'})
})
app.get('/services/register', (req, res) => {
res.json( {msg: 'not yet implemented'})
// example {name:'hmdlink', desc:'share URL between local devices', protocol:'http', port:8082, path: '/hmdlink', url:'http://192.168.4.3:8082/hmdlink'},
2 years ago
})
app.get('/services', (req, res) => {
// could be probbed first to check for availability
// should be updated also via register/unregister
2 years ago
res.json( [
{name:'kiwix', desc:'offline Wikipedia, Stackoverflow, etc', protocol:'http', port:8080, url:'http://192.168.4.3:8080'},
{name:'hmdlink', desc:'share URL between local devices', protocol:'http', port:8082, path: '/hmdlink', url:'http://192.168.4.3:8082/hmdlink'},
] )
})
let dynURL = 'https://192.168.4.1/offline.html'
app.get('/hmdlink/set', (req, res) => { // could be a PUT instead
// e.g http://192.168.4.3:8082/hmdlink/set?url=http://192.168.4.3:8082/114df5f8-3921-42f0-81e7-48731b563571.thumbnails/f07120ba-0ca1-429d-869f-c704a52b7aa3.png
dynURL = req.query.url
res.redirect( dynURL )
})
2 years ago
app.get('/hmdlink', (req, res) => {
res.redirect( dynURL )
2 years ago
})
app.get('/json', (req, res) => {
res.json( instructions.split('\n') )
})
app.get('/', (req, res) => {
res.send( instructions )
})
app.get('/localprototypes', (req, res) => {
res.json( spawn('find Prototypes/ -iwholename */.git/config | xargs grep git.benetou.fr') )
})
const https = require("https");
const fs = require("fs");
const privateKey = fs.readFileSync("naf-key.pem", "utf8");
const certificate = fs.readFileSync("naf.pem", "utf8");
const credentials = { key: privateKey, cert: certificate };
2 years ago
const webServer = https.createServer(credentials, app);
2 years ago
// Start Express http server
// const webServer = http.createServer(app);
2 years ago
// Listen on port
webServer.listen(port, () => {
console.log("listening on http://localhost:" + port);
});