electron-pos-printer
Version:
Electron printer plugin for 80mm, 78mm, 76mm, 58mm, 57mm, 44mm printers
1 lines • 6.46 kB
JavaScript
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("electronPosPrinter",[],t):"object"==typeof exports?exports.electronPosPrinter=t():e.electronPosPrinter=t()}(global,()=>(()=>{"use strict";var e={d:(t,r)=>{for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{PosPrinter:()=>d});const r=require("electron"),n=require("path"),o=require("os"),i=require("fs"),s=require("child_process");function a(e,t,n){return new Promise((o,i)=>{r.ipcMain.once(`${e}-reply`,(e,t)=>{t.status?o(t):i(t.error)}),t.send(e,n)})}function c(e){return Math.ceil(264.5833*e)}var l=function(e,t,r,n){return new(r||(r=Promise))(function(o,i){function s(e){try{c(n.next(e))}catch(e){i(e)}}function a(e){try{c(n.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(s,a)}c((n=n.apply(e,t||[])).next())})};if("renderer"==process.type)throw new Error('electron-pos-printer: use remote.require("electron-pos-printer") in the render process');class d{static print(e,t){return new Promise((o,i)=>{var s;t.preview||t.printerName||t.silent||i(new Error("A printer name is required, if you don't want to specify a printer name, set silent to true").toString()),"object"==typeof t.pageSize&&(t.pageSize.height&&t.pageSize.width||i(new Error("height and width properties are required for options.pageSize")));let p=!1,m=null;const u=(null==t?void 0:t.copies)||1;let g=(null!==(s=t.timeOutPerLine)&&void 0!==s?s:400)*e.length+2e3*u+200;t.preview||t.silent||setTimeout(()=>{if(!p){const e=m||"[TimedOutError] Make sure your printer is connected";h&&!h.isDestroyed()&&h.close(),i(e),p=!0}},g);let h=new r.BrowserWindow(Object.assign(Object.assign({},function(e){let t=219,r=1200;if("string"==typeof e)switch(e){case"44mm":t=166;break;case"57mm":t=215;break;case"58mm":t=219;break;case"76mm":t=287;break;case"78mm":t=295;break;case"80mm":t=302}else"object"==typeof e&&(t=e.width,r=e.height);return{width:t,height:r}}(t.pageSize)),{show:!!t.preview,webPreferences:{nodeIntegration:!0,contextIsolation:!1}}));h.on("closed",()=>{h=null}),h.loadFile(t.pathTemplate||(0,n.join)(__dirname,"renderer/index.html")),h.webContents.on("did-finish-load",()=>l(this,void 0,void 0,function*(){return yield a("body-init",h.webContents,t),d.renderPrintDocument(h,e).then(()=>l(this,void 0,void 0,function*(){let{width:r,height:n}=function(e){let t=58e3,r=1e4;if("string"==typeof e)switch(e){case"44mm":t=Math.ceil(44e3);break;case"57mm":t=Math.ceil(57e3);break;case"58mm":t=Math.ceil(58e3);break;case"76mm":t=Math.ceil(76e3);break;case"78mm":t=Math.ceil(78e3);break;case"80mm":t=Math.ceil(8e4)}else"object"==typeof e&&(t=c(e.width),r=c(e.height));return{width:t,height:r}}(t.pageSize);if("string"==typeof t.pageSize){const e=yield h.webContents.executeJavaScript("document.body.clientHeight");n=c(e)}if(t.preview)o({complete:!0,data:e,options:t});else{let e=0;const s=()=>{h&&!h.isDestroyed()&&h.webContents.print(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({silent:!!t.silent,printBackground:!!t.printBackground,deviceName:t.printerName,copies:1,pageSize:{width:r,height:n}},t.header&&{header:t.header}),t.footer&&{footer:t.footer}),t.color&&{color:t.color}),t.printBackground&&{printBackground:t.printBackground}),t.margins&&{margins:t.margins}),t.landscape&&{landscape:t.landscape}),t.scaleFactor&&{scaleFactor:t.scaleFactor}),t.pagesPerSheet&&{pagesPerSheet:t.pagesPerSheet}),t.collate&&{collate:t.collate}),t.pageRanges&&{pageRanges:t.pageRanges}),t.duplexMode&&{duplexMode:t.duplexMode}),t.dpi&&{dpi:t.dpi}),(r,n)=>{if(!r)return m=n,void(p||(p=!0,h&&!h.isDestroyed()&&h.close(),i(new Error(n||"Print failed"))));e++,e<u?s():p||(p=!0,h&&!h.isDestroyed()&&h.close(),o({complete:!0,options:t}))})};s()}})).catch(e=>i(e))}))})}static sendRawCommand(e,t){return new Promise((r,a)=>{var c;if(!e)return a(new Error("printerName is required for sendRawCommand"));if("win32"===process.platform){const l=(0,n.join)((0,o.tmpdir)(),`pos_raw_${Date.now()}.bin`).replace(/\\/g,"/");try{(0,i.writeFileSync)(l,t)}catch(e){return a(e)}const d=`Add-Type -AssemblyName System.Printing; $srv = New-Object System.Printing.LocalPrintServer; $q = $srv.GetPrintQueue('${e.replace(/'/g,"''")}'); $j = $q.AddJob('pos_raw'); $s = $j.JobStream; $b = [System.IO.File]::ReadAllBytes('${l.replace(/'/g,"''")}'); $s.Write($b, 0, $b.Length); $s.Close()`,p=(0,s.spawn)("powershell.exe",["-NoProfile","-NonInteractive","-Command",d],{shell:!1});let m="";null===(c=p.stderr)||void 0===c||c.on("data",e=>{m+=e.toString()}),p.on("close",e=>{try{(0,i.unlinkSync)(l)}catch(e){}0===e?r():a(new Error(`sendRawCommand failed on Windows (exit ${e}): ${m.trim()}`))}),p.on("error",a)}else{const n=(0,s.spawn)("lp",["-d",e,"-o","raw","-"],{stdio:["pipe","ignore","pipe"]});let o="";n.stderr.on("data",e=>{o+=e.toString()}),n.on("close",e=>{0===e?r():a(new Error(`sendRawCommand failed (lp exit ${e}): ${o.trim()}`))}),n.on("error",a),n.stdin.write(t),n.stdin.end()}})}static openCashDrawer(e,t={}){var r,n;const o=5===t.pin?1:0,i=Math.min(255,Math.max(0,Math.round((null!==(r=t.onTime)&&void 0!==r?r:25)/2))),s=Math.min(255,Math.max(0,Math.round((null!==(n=t.offTime)&&void 0!==n?n:250)/2))),a=Buffer.from([27,112,o,i,s]);return d.sendRawCommand(e,a)}static renderPrintDocument(e,t){return new Promise((r,n)=>l(this,void 0,void 0,function*(){for(const[r,o]of t.entries()){if("image"===o.type&&!o.path&&!o.url){e.close(),n(new Error("An Image url/path is required for type image").toString());break}if(o.css){e.close(),n(new Error("`options.css` in {css: "+o.css.toString()+"} is no longer supported. Please use `options.style` instead. Example: {style: {fontSize: 12}}"));break}if(o.style&&"object"!=typeof o.style){e.close(),n(new Error('`options.styles` at "'+o.style+'" should be an object. Example: {style: {fontSize: 12}}'));break}yield a("render-line",e.webContents,{line:o,lineIndex:r}).then(t=>{if(!t.status)return e.close(),void n(t.error)}).catch(e=>{n(e)})}r({message:"page-rendered"})}))}}return t})());