forked from rafaelmotta/bematech-printer
-
Notifications
You must be signed in to change notification settings - Fork 0
/
application.js
120 lines (95 loc) · 4.28 KB
/
application.js
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
'use strict';
const io = require('socket.io')(7333);
const Printer = require('./bematech/printer');
let socket = null;
let printers = {};
module.exports = {
start() {
io.on('connection', this._onSocketConnection.bind(this));
},
// @name print
// @description Realiza impressão
// @params {Object} options - Detalhes da impressão, como IP / Porta da impressora, dados de template e layout de impressão
print(options) {
socket.emit('print:start');
this._validatePrint(options).then(() => {
// Notifica recebimento de impressão
io.emit('print:message', { description: `Recebendo pedido de impressão`, time: new Date(), type: 'info' });
io.emit('print:message', { description: `Layout: ${options.layout}`, time: new Date(), type: 'info' });
io.emit('print:message', { description: `IP: ${options.printer.ip}:${options.printer.port}`, time: new Date(), type: 'info' });
this._loadPrinter(options).then((printer) => {
return printer.print(options).then(() => {
socket.emit('print:end');
io.emit('print:message', { description: 'Impressão realizada com sucesso', time: new Date(), type: 'success' });
});
}, (err) => {
return io.emit('print:error', { description: err.description, code: err.code, time: new Date(), type: 'error' });
});
}, (err) => {
return io.emit('print:error', { description: err.description, code: err.code, time: new Date(), type: 'error' });
});
},
// @name _onSocketConnection
// @description Método de callback de conexão com socket.io
// @params {Object} _socket - socket io
_onSocketConnection(_socket) {
socket = _socket;
// Envia mensagem informando que socket está conectado
socket.emit('socket:connected', {});
socket.on('print', this.print.bind(this));
},
// @name _validatePrint
// @description Verifica se os dados enviados para impressão estão corretos
// @params {Object} options - Detalhes da impressão, como IP / Porta da impressora, dados de template e layout de impressão
_validatePrint(options) {
return new Promise((resolve, reject) => {
// Verifica se há impressora
if(!options.printer) {
return reject({ description: 'Para imprimir deve ser passado um objeto com dados da impressora', code: 100 });
}
if(!options.copies) {
options.copies = 1;
}
if(!Number.isInteger(options.copies)) {
return reject({ description: 'Número de cópias deve ser um número inteiro', code: 104 });
}
// Verifica se há IP
if(!options.printer.ip) {
return reject({ description: 'Para imprimir deve ser informado o IP da impressora', code: 101 });
}
// Verifica se há porta
if(!options.printer.port) {
return reject({ description: 'Para imprimir deve ser informado a porta da impressora', code: 102 });
}
// Verifica se há layout
if(!options.layout) {
return reject({ description: 'Para imprimir deve ser informado um layout de impressão', code: 103 });
}
return resolve();
});
},
// @name _loadPrinter
// @description Carrega impressora
// @params {Object} options - Detalhes da impressão, como IP / Porta da impressora, dados de template e layout de impressão
_loadPrinter(options) {
return new Promise((resolve, reject) => {
// Impressora já foi carregada pelo sistema
if(printers[options.printer.ip]) {
io.emit('print:message', { description: 'Impressora já encontra-se carregada', time: new Date(), type: 'info' });
return resolve(printers[options.printer.ip]);
// Impressora ainda não foi carregada
} else {
io.emit('print:message', { description: 'Impressora precisa ser carregada...', time: new Date(), type: 'info' });
// Cria novo socket com impressora
new Printer({ ip: options.printer.ip, port: 9100 }).then((_printer) => {
// Adiciona num objeto para facilitar encontrar em um futuro
printers[options.printer.ip] = _printer;
io.emit('print:message', { description: 'Criado socket com a impressora', time: new Date(), type: 'info' });
return resolve(printers[options.printer.ip]);
}, (err) => {
return reject(err);
});
}
});
}
};