|
@@ -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
|
|
|
}
|