Skip to content
Snippets Groups Projects
deviceserver.js 3.31 KiB
Newer Older
  • Learn to ignore specific revisions
  • Neil Gershenfeld's avatar
    Neil Gershenfeld committed
    //
    
    Neil Gershenfeld's avatar
    Neil Gershenfeld committed
    // deviceserver.js
    //    WebSocket device server
    
    Neil Gershenfeld's avatar
    Neil Gershenfeld committed
    //
    // Neil Gershenfeld 
    
    // (c) Massachusetts Institute of Technology 2019
    
    Neil Gershenfeld's avatar
    Neil Gershenfeld committed
    // 
    // This work may be reproduced, modified, distributed, performed, and 
    // displayed for any purpose, but must acknowledge the mods
    // project. Copyright is retained and must be preserved. The work is 
    // provided as is; no warranty is provided, and users accept all 
    // liability.
    //
    // check command line
    //
    if (process.argv.length < 4) {
    
    Neil Gershenfeld's avatar
    Neil Gershenfeld committed
       console.log("command line: node deviceserver.js client_address server_port")
    
    Neil Gershenfeld's avatar
    Neil Gershenfeld committed
       process.exit(-1)
       }
    //
    // start server
    //
    var client_address = process.argv[2]
    var server_port = process.argv[3]
    console.log("listening for connection from client address "+client_address+" on server port "+server_port)
    var fs = require("fs")
    var WebSocketServer = require('ws').Server
    wss = new WebSocketServer({port:server_port})
    //
    // handle connection
    //
    wss.on('connection',function(ws) {
       //
       // check address
       //
       if (ws._socket.remoteAddress != client_address) {
          console.log("connection rejected from "+ws._socket.remoteAddress)
          ws.send('socket closed')
          ws.close()
          }
       else {
          console.log("connection accepted from "+ws._socket.remoteAddress)
          }
       //
       // handle messages
       //
       var cancel
       ws.on("message",function(msg) {
          //
          // cancel job
          //
          if (msg == 'cancel') {
             cancel = true
             }
          //
          // start job
          //
          else {
             var count = 0
             var file
             var job = JSON.parse(msg)
             console.log('writing '+job.name+' (length '+job.contents.length+') to /dev/'+job.device)
             cancel = false
             fs.open('/dev/'+job.device,'w',function(err,fd) {
                if (err) {
                   console.log('error: '+err)
                   ws.send('error: '+err)
                   }
                else {
                   file = fd
                   write_char()
                   }
                })
             //
             // character writer
             //
             function write_char() {
                //
                // cancel
                //
                if (cancel) {
                   console.log('cancel')
                   ws.send('cancel')
                   fs.close(file)
                   }
                //
                // continue
                //
                else {
                   fs.write(file,job.contents[count],function(err,written,string) {
                      if (err) {
                         console.log('error '+err+' count '+count)
                         ws.send('error '+err+' count '+count)
                         }
                      else {
                         ws.send((count+1)+'/'+job.contents.length)
                         count += 1
                         if (count < job.contents.length)
                            write_char()
                         else {
                            console.log('done')
                            ws.send('done')
    
                            fs.close(file,function(err) {
                               if (err) {
                                  console.log('error: '+err)
                                  ws.send('error: '+err)
                                  }
                               })
    
    Neil Gershenfeld's avatar
    Neil Gershenfeld committed
                            }
                         }
                      })
                   }
                }
             }
          })
       //
       // close
       //
       ws.on("close",function() {
          console.log("connection closed")
          })
       })