Skip to content
Snippets Groups Projects
Select Git revision
  • b6f328672ca01130f9d0c1036393419666c6ce15
  • master default
  • neil
  • hpgl
  • sw-shawn-liu
  • ppa
  • fran
  • trotec-port
  • fs-hotfix
  • jake
  • ml-mods
  • fabmo-app
12 results

printserver.js

Blame
  • Shawn Liu's avatar
    Shawn Liu authored
    Websocket Print, instead of entering printer name, now it shows printer list with default printer on focus. Also, updated all referenced programs.
    c71a8509
    History
    printserver.js 4.44 KiB
    //
    // printserver.js
    //    WebSocket print server
    //
    // dependencies:
    //    npm install printer ws
    //    Windows
    //       npm install --global windows-build-tools
    //    Linux
    //       sudo apt-get install node-gyp
    //       sudo apt-get install libcups2-dev
    //
    // Neil Gershenfeld 
    // (c) Massachusetts Institute of Technology 2017
    // 
    // 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) {
       console.log("command line: node printserver.js client_address server_port")
       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)
    //
    // requires
    //
    var printer = require("printer")
    var WebSocketServer = require('ws').Server
    //
    // start WebSocket server
    //
    wss = new WebSocketServer({port:server_port})
    //
    // handle connection
    //
    wss.on('connection',function(ws) {
       //
       // check address
       //
       if (!ws._socket.remoteAddress) {
          console.log("connection rejected from "+ws._socket.remoteAddress)
          ws.send('socket closed')
          ws.close()
          }
       else {
          console.log("connection accepted from "+ws._socket.remoteAddress)
          // get printer list
          function getPrinterList() {
             var printerList = []
             var printers = printer.getPrinters()
             if (printers && printers.length) {
                var i = printers.length
                for (i in printers) {
                   var pr = printers[i]
                   printerList.push(pr.name)
                   }
                }
             var printerListObj = {}
             printerListObj['printerList'] = printerList
             printerListObj['default'] = printer.getDefaultPrinterName()
             return printerListObj
             }
    
           ws.send(JSON.stringify(getPrinterList()))
           ws.send('socket opened')
          }
       //
       // handle messages
       //
       var cancel
       var pagesPrinted
       ws.on("message",function(msg) {
          console.log(msg)
          //
          // cancel job
          //
          if (msg == 'cancel') {
             cancel = true
             }
          //
          // start job
          //
          else {
             var job = JSON.parse(msg)
             console.log('writing '+job.name+' (length '+job.contents.length+') to printer '+job.printer)
             cancel = false
             print()
             //
             // print all
             //
             function print() {
                console.log(job.contents)
                printer.printDirect({data:job.contents,type:'RAW',
                 printer:job.printer,success: function (jobID) {
                   console.log("sent to printer with ID: "+jobID)
                   check_process()
                   //
                   // Check process
                   //
                   function check_process() {
                      var jobInfo
                      try {
                         jobInfo = printer.getJob(job.printer,jobID)
                         }
                      catch (err) {
                         ws.send('done')
                         return
                         }
                      console.log("current job info:"+
                         JSON.stringify(jobInfo))
                      if (jobInfo.status.indexOf('PRINTED') !== -1) {
    
                         var ret = printer.setJob(job.printer,
                            jobID,'CANCEL')
    
                         ws.send('done')
                         return
                         }
                      //
                      // cancel
                      //
                      if (cancel) {
                         console.log('cancelling...')
                         ws.send('cancel')
                         var ret = printer.setJob(job.printer,
                            jobID,'CANCEL')
                         console.log("cancelled: "+ret)
                         }
                      //
                      // continue
                      //
                      else {
                         ws.send(jobInfo.status[0])
                         setTimeout(check_process,1000)
                         }
                      }
                   }, error: function(err) {
                      console.log(err)
                      ws.send('error '+err)
                      }
                   })
                }
             }
          })
       //
       // close
       //
       ws.on("close",function() {
          console.log("connection closed")
          })
       })