All files / services/printer printZPLWorker.js

0% Statements 0/63
0% Branches 0/22
0% Functions 0/12
0% Lines 0/59

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127                                                                                                                                                                                                                                                             
require('babel-register');
require('babel-polyfill');
 
const path = require('path');
const fs = require('fs');
const cmd = require('node-cmd');
const moment = require('moment');
const { parentPort, workerData } = require('worker_threads');
 
const { PATH_TEMP } = workerData;
 
// Funcao de envio de mensagem utilizada para logging
function sendMessage(message = '') {
  if (parentPort) parentPort.postMessage(message);
}
 
function finishWork() {
  sendMessage('done');
  process.exit(0);
}
 
async function removeFile(filePath) {
  return new Promise((resolve, reject) => {
    fs.unlink(filePath, (err, data) => {
      if (err) {
        sendMessage(`REMOVE FILE ${err}`);
        resolve(err);
      } else {
        resolve(data);
      }
    });
  });
}
 
async function generateFile(fileName, label) {
  return new Promise((resolve, reject) => {
    const filePath = path.join(PATH_TEMP, fileName);
    fs.writeFile(filePath, label, 'utf8', (err) => {
      if (err) reject(err);
      else resolve(filePath);
    });
  });
}
 
function generatePrinterCommand(printer, filePath) {
  let printerParsed = printer;
  let splitedRemote = [];
  let host = '';
  let printerName = '';
  // Replace para evitar injecao de comando no servidor
  printerParsed = printerParsed.replace(/[^0-9a-zA-Z\.\-_/\\:]/g, '');
 
  // Se conter contra barra ou barra, entao e endereco remoto
  const isRemote = printerParsed.includes('\\') || printerParsed.includes('/');
 
  // Backend rondado no windows
  if (process.platform === 'win32') {
    // Faz o replace para barras do windows
    printerParsed = printerParsed.replace(/[\/]/g, '\\');
    printerParsed = printerParsed.replace(/(\\\\)/g, '');
 
    // Split em host e printerName
    splitedRemote = printerParsed.split('\\').filter((it) => it);
 
    if (isRemote) {
      host = splitedRemote[0];
      printerName = splitedRemote[1];
 
      // Comando type do windows envia a impressao para a printer
      return `type ${filePath} > \\\\${host}\\${printerName}`;
    }
 
    // Comando type do windows envia a impressao para a printer
    return `type ${filePath} > ${printerParsed[0]}`;
  }
  printerParsed = printerParsed.replace(/[\\]/g, '/');
  printerParsed = printerParsed.replace(/(\/\/)/g, '');
 
  // Split em host e printerName
  splitedRemote = printerParsed.split('/').filter((it) => it);
 
  /* if (isRemote) {
      host = splitedRemote[0];
      printerName = splitedRemote[1];
 
      // Comando lp do linux envia a impressao para a printer
      return `lp -d ${printerName} -h ${host} ${filePath}`;
    } */
 
  printerName = splitedRemote[1];
 
  // Comando lp do linux envia a impressao para a printer
  return `lp -d ${printerName} ${filePath}`;
}
 
(async () => {
  const { printer, label, type } = workerData;
  if (label && printer) {
    const file = `etiq_${type}_${moment().valueOf()}_${Math.floor(
      Math.random() * 1000
    )}.tmp`;
 
    const filePath = await generateFile(file, label);
 
    try {
      const command = generatePrinterCommand(printer, filePath);
      const result = cmd.runSync(command);
      await removeFile(filePath);
 
      if (!result || (result && result.err)) {
        const errorStr = `COMMAND - ( ${command} ) | ERROR - ${result.err}`;
        sendMessage(errorStr);
      }
    } catch (error) {
      try {
        await removeFile(filePath);
        sendMessage(error.message);
      } catch (errFile) {
        sendMessage(errFile.message);
      }
    }
  }
 
  // Finalizado
  finishWork();
})();