Skip to content
Snippets Groups Projects
ltv.js 3.64 KiB
Newer Older
  • Learn to ignore specific revisions
  • Jake Read's avatar
    Jake Read committed
    // ltv system 
    
    const express = require('express')
    const app = express()
    // this include lets us read data out of put requests,
    const bodyparser = require('body-parser')
    // our fs tools,
    const fs = require('fs')
    //const filesys = require('./filesys.js')
    // and we occasionally spawn local pipes (workers)
    const child_process = require('child_process')
    // will use these to figure where tf we are
    let ownIp = ''
    const os = require('os')
    
    // serve everything: https://expressjs.com/en/resources/middleware/serve-static.html
    app.use(express.static(__dirname))
    // accept post bodies as json,
    app.use(bodyparser.json())
    app.use(bodyparser.urlencoded({ extended: true }))
    
    // redirect traffic to /client,
    app.get('/', (req, res) => {
        res.redirect('/client')
    })
    
    // we also want to institute some pipes: this is a holdover for a better system
    // more akin to nautilus, where server-side graphs are manipulated
    // for now, we just want to dive down to a usb port, probably, so this shallow link is OK
    let processes = []
    app.get('/startLocal/:file', (req, res) => {
        // launches another node instance at this file w/ these args,
        let args = ''
        if (req.query.args) {
            args = req.query.args.split(',')
        }
        console.log(`attempt to start ${req.params.file} with args ${args}`)
        // startup, let's spawn,
        const process = child_process.spawn('node', ['-r', 'esm', `local/${req.params.file}`])
        // add our own tag,
        process.fileName = req.params.file
        let replied = false
        let pack = ''
        process.stdout.on('data', (buf) => {
            // these emerge as buffers,
            let msg = buf.toString()
            // can only reply once to xhr req
            if (msg.includes('wss-addr:') && !replied) {
                res.send(msg)
                replied = true
            }
            // ok, dealing w/ newlines
            pack = pack.concat(msg)
            let index = pack.indexOf('\n')
            while (index >= 0) {
                console.log(`${process.fileName} ${process.pid}: ${pack.substring(0, index)}`)
                pack = pack.slice(index + 1)
                index = pack.indexOf('\n')
            }
        })
        process.stderr.on('data', (err) => {
            if (!replied) {
                res.send('err in local script')
                replied = true
            }
            console.log(`${process.fileName} ${process.pid} err:`, err.toString())
        })
        process.on('close', (code) => {
            console.log(`${process.fileName} ${process.pid} closes:`, code)
            if (!replied) {
                res.send('local process closed')
                replied = true
            }
        })
        console.log(`started ${process.fileName} w/ pid ${process.pid}`)
    })
    
    // finally, we tell the express server to listen here:
    let port = 8080
    app.listen(port)
    
    // once we're listening, report our IP:
    let ifaces = os.networkInterfaces()
    // this just logs the processes IP's to the termina
    Object.keys(ifaces).forEach(function (ifname) {
        var alias = 0;
    
        ifaces[ifname].forEach(function (iface) {
            if ('IPv4' !== iface.family) {//} || iface.internal !== false) {
                // skip over internal (i.e. 127.0.0.1) and non-ipv4 addresses
                return;
            }
            ownIp = iface.address
            if (alias >= 1) {
                console.log('ltv available on: \t' /*ifname + ':' + alias,*/ + iface.address + `:${port}`);
                // this single interface has multiple ipv4 addresses
                // console.log('serving at: ' ifname + ':' + alias + iface.address + `:${port}`);
            } else {
                console.log('ltv available on:\t' /*ifname + ':' + alias,*/ + iface.address + `:${port}`);
                // this interface has only one ipv4 adress
                //console.log(ifname, iface.address);
            }
            ++alias;
        });
    });