Skip to content
Snippets Groups Projects
views.js 4.77 KiB
Newer Older
  • Learn to ignore specific revisions
  • Jake Read's avatar
    Jake Read committed
    // file system to load / look at our available modules / edit them 
    const fs = require('fs')
    
    // express serves files, http makes the connection
    const app = require('express')()
    const http = require('http').Server(app)
    
    // websocket, to share program representations with the client (and back)
    const WebSocket = require('ws')
    
    
    Jake Read's avatar
    Jake Read committed
    const Reps = require('./reps.js')
    
    
    Jake Read's avatar
    Jake Read committed
    SERVER AND WS SETUP --------------------------------------------------
    
    Jake Read's avatar
    Jake Read committed
    var program = null
    
    Jake Read's avatar
    Jake Read committed
    var sckt = null
    
    function startHttp() {
        // serving this handful of static files
        app.get('/', (req, res) => {
            console.log('client req /')
            res.sendFile(__dirname + '/client/index.html')
        })
    
        app.get('/:file', (req, res) => {
            console.log('client req', req.params.file)
            res.sendFile(__dirname + '/client/' + req.params.file)
        })
    
        // through this window
        http.listen(8080, () => {
            console.log('listening on 8080 for static files')
        })
    }
    
    
    function startWs() {
        // and listening for requests here
        const wss = new WebSocket.Server({ port: 8081 })
    
        wss.on('connection', (ws) => {
            sckt = ws
            // say hello
            socketSend('console', 'hello client')
            // send current config as list of all modules
            console.log('socket open on 8081')
            ws.on('message', (evt) => {
                socketRecv(evt)
            })
    
    Jake Read's avatar
    Jake Read committed
        })
    
    Jake Read's avatar
    Jake Read committed
    }
    
    
    Jake Read's avatar
    Jake Read committed
    /*
    
    HOOKUP REF TO TL ------------------------------------------------------
    
    */
    
    function assignProgram(prgm) {
        program = prgm
    }
    
    /*
    
    RECV / SEND PORTALS ---------------------------------------------------
    
    */
    
    
    Jake Read's avatar
    Jake Read committed
    function socketRecv(evt) {
        var recv = JSON.parse(evt)
        var type = recv.type
        var data = recv.data
        //console.log('RECV', recv)
        // bang thru
        switch (type) {
            case 'console':
                console.log('RECV CONSOLE:', data)
                break
    
    Jake Read's avatar
    Jake Read committed
            case 'get current program':
                uiRequestCurrentProgram()
                break
            case 'get module menu':
                uiRequestModuleMenu()
                break
            case 'load program':
                uiRequestLoadProgram()
    
    Jake Read's avatar
    Jake Read committed
                break
    
    Jake Read's avatar
    Jake Read committed
            case 'put module':
                uiRequestNewModule(data)
    
    Jake Read's avatar
    Jake Read committed
                break
            case 'put state':
    
    Jake Read's avatar
    Jake Read committed
                uiRequestStateChange(data)
    
    Jake Read's avatar
    Jake Read committed
                break
            case 'put link':
    
    Jake Read's avatar
    Jake Read committed
                uiRequestLinkChange(data)
    
    Jake Read's avatar
    Jake Read committed
                // id:output > id:input
                break
            case 'put ui':
    
    Jake Read's avatar
    Jake Read committed
                uiRequestUiChange(data)
    
    Jake Read's avatar
    Jake Read committed
                break
            default:
                console.log('ERR server recv with non recognized type', recv)
                break
        }
    }
    
    function socketSend(type, data) {
        if (sckt) {
            var msg = {
                type: type,
                data: data
            }
            //console.log('SEND', msg)
            sckt.send(JSON.stringify(msg))
        }
    }
    
    
    Jake Read's avatar
    Jake Read committed
    /*
    
    HEAP -> UI HANDLES ---------------------------------------------------
    
    */
    
    Jake Read's avatar
    Jake Read committed
    
    // runs when browser first loads
    
    Jake Read's avatar
    Jake Read committed
    function uiRequestCurrentProgram() {
    
    Jake Read's avatar
    Jake Read committed
        // make reps from program and send the list 
    
    Jake Read's avatar
    Jake Read committed
        console.log('SEND PROGRAMS TO UI')
        var prgRep = {
            description: {
                name: program.description.name,
                id: program.description.id,
                path: program.description.path
            },
            modules: {}
        }
    
        for (mdlName in program.modules) {
            var mdlRep = Reps.makeFromModule(program.modules[mdlName])
            prgRep.modules[mdlName] = mdlRep
        }
        socketSend('put program', prgRep)
    }
    
    function uiRequestModuleMenu() {
        var availableSourceRep = {}
        var dir = fs.readdirSync('./src')
        for (i in dir) {
            availableSourceRep[dir[i]] = {}
            var subdir = fs.readdirSync('./src/' + dir[i])
            for (j in subdir) {
                // find js files
                if (subdir[j].slice(-3) === '.js') {
                    var obj = {}
                    obj.path = './src/' + dir[i] + '/' + subdir[j]
                    availableSourceRep[dir[i]][subdir[j].slice(0, -3)] = obj
                }
            }
        }
    
        socketSend('put module menu', availableSourceRep)
    
    Jake Read's avatar
    Jake Read committed
    }
    
    
    Jake Read's avatar
    Jake Read committed
    /*
    
    UI -> HEAP HANDLES ---------------------------------------------------
    
    */
    
    function uiRequestLoadProgram(data){
        console.log('UI REQUEST TO OPEN NEW PROGRAM', data)
    }
    
    Jake Read's avatar
    Jake Read committed
    
    
    Jake Read's avatar
    Jake Read committed
    function uiRequestNewModule(data) {
        console.log('UI REQUEST ADD MODULE TO PROGRAM', data)
    }
    
    function uiRequestStateChange(data) {
        console.log('UI REQUEST CHANGE STATE IN MODULE', data)
        // do state.obj.emit 
    }
    
    function uiRequestLinkChange(data) {
        console.log('UI REQUEST ADD EVENT LINK', data)
    }
    
    function uiRequestUiChange(data) {
        console.log('UI REQUEST ADD / CHANGE UI INFO TO MODULE', data)
        // do it in module.description 
    }
    
    /*
    
    EXPORTS --------------------------------------------------------------
    
    */
    
    Jake Read's avatar
    Jake Read committed
    module.exports = {
        startHttp: startHttp,
        startWs: startWs,
        uiSocket: {
            send: socketSend
        },
        assignProgram: assignProgram
    }