Explorar el Código

[ADD] print queue

Gogs hace 6 años
padre
commit
177cfebc42
Se han modificado 1 ficheros con 97 adiciones y 34 borrados
  1. 97 34
      src/print.js

+ 97 - 34
src/print.js

@@ -1,72 +1,134 @@
-import { v5 as UUIDv5 } from 'uuid'
+import UUID from 'uuid/v4'
 import { printDirect, getPrinters, getDefaultPrinterName, getJob } from 'printer'
 
-const printQueue = []
-
 const REQUEST_PRINTER_NAME = 'request_printer_name'
 const SHOW_PRINT_STATUS = 'show_print_status'
 
+const printQueue = []
+
+/**
+ * 
+ * @param {*} id 
+ */
+const removeRequestQueued = id => {
+    let index = -1
+
+    for (let i = 0; i < printQueue.length; i++) {
+        if (printQueue[i].id === id) {
+            index = i
+            break
+        }
+    }
+
+    printQueue.splice(index, 1) !== 0
+}
+
+
+/**
+ * 
+ * @param {*} id 
+ */
+const getRequestQueued = id => {
+    let request = null
+
+    for (let r of printQueue) {
+        if (r.id === id) {
+            return r;
+        }
+    }
+
+    return request
+}
+
+/**
+ * 
+ * @param {*} mimeType 
+ */
+const getFormat = mimeType => {
+    if (mimeType.indexOf('application/pdf') != -1) {
+        return 'PDF'
+    }
+
+    if (mimeType.indexOf('text/plain') != -1) {
+        return 'RAW'
+    }
+
+    return 'RAW'
+}
 
 /**
  * 
- * @param {*} param0 
+ * @param {*} socket 
+ * @param {*} request 
  */
-const requestPrint = (socket, request) => {
-    const defaultPrinter = getDefaultPrinterName()
-
-    socket.emit(SHOW_PRINTERS, getPrinters())
-    return
-    
-    if (!defaultPrinter) {
-        socket.emit(SHOW_PRINTERS, getPrinters())
+const doPrint = (socket, request) => {
+    if (!request.data && request.id) {
+        let requestQueued = getRequestQueued(request.id)
+        
+        if (!requestQueued) {
+            socket.emit(SHOW_PRINT_STATUS, {
+                status: 'failed'
+            })
+            return
+        }
+
+        if (!request.printer) {
+            removeRequestQueued(request.id)
+            socket.emit(SHOW_PRINT_STATUS, {
+                status: 'canceled'
+            })
+            return
+        }
+
+        request.data = requestQueued.data
+    }
+
+    if (!request.printer) {
+        request.printer = getDefaultPrinterName()
+    }
+
+    const mimeTypeRegex = request.data.match(/data:[a-zA-Z0-9]+\/[a-zA-Z0-9-.+]+.*,/)
+
+    if (!mimeTypeRegex) {
+        socket.emit(SHOW_PRINT_STATUS, {
+            status: 'unknown'
+        })
         return
     }
 
-    const data = request.data.replace(/(data:[a-zA-Z0-9]+\/[a-zA-Z0-9-.+]+.*,)/, '')
-    const buffer = Buffer.from(data, 'base64')
+    const format = getFormat(mimeTypeRegex[0])
+    const buffer = Buffer.from(request.data.replace(mimeTypeRegex[0], ''), 'base64')
 
     printDirect({
         data: buffer,
-        printer: defaultPrinter,
-        type: 'PDF',
+        printer: request.printer,
+        type: format,
         success: jobId => {
-            const job = getJob(defaultPrinter, jobId)
-
-            console.log(job)
+            const job = getJob(request.printer, jobId)
             
             if (job.status.includes('PRINTING')) {
                 socket.emit(SHOW_PRINT_STATUS, {
                     status: 'printing',
-                    printer: defaultPrinter
+                    printer: request.printer
                 })
             }
 
             if (job.status.includes('PRINTED')) {
                 socket.emit(SHOW_PRINT_STATUS, {
                     status: 'printed',
-                    printer: defaultPrinter
+                    printer: request.printer
                 })
             }
         },
         error: e => {
             socket.emit(SHOW_PRINT_STATUS, {
                 status: 'error',
-                printer: defaultPrinter
+                printer: request.printer
             })
         }
     })
 }
 
-/**
- * 
- * @param {*} socket 
- * @param {*} request 
- */
-const doPrint = (socket, request) => {
-    const printerName = null
-
-}
-
 /**
  * 
  * @param {*} socket 
@@ -74,11 +136,12 @@ const doPrint = (socket, request) => {
  */
 const printProcessor = (socket, request) => {
     if (!request.print_directly) {
-        request.id = UUIDv5()
+        request.id = UUID()
         printQueue.push(request)
 
         socket.emit(REQUEST_PRINTER_NAME, {
-            id: request.id
+            id: request.id,
+            printers: getPrinters()
         })
         return
     }