node-lpr
Version:
line printer remote library for Node.js
118 lines (100 loc) • 3.17 kB
JavaScript
var net = require('net');
var os = require('os');
var CONSTANTS = require('./constants');
var job = require('./job');
var LF = Buffer.alloc(1);
LF.writeUInt8(CONSTANTS.LF);
var SP = Buffer.alloc(1);
SP.writeUInt8(CONSTANTS.SP);
var lpr = function(options) {
this.options = options || {};
this.options.ip = options.ip || CONSTANTS.DEFAULT.IP;
this.options.port = options.port || CONSTANTS.DEFAULT.PORT;
this.options.queue = options.queue || CONSTANTS.DEFAULT.QUEUE;
this.options.user = options.user || CONSTANTS.DEFAULT.USER;
this.debug = options.debug || function() {};
this.jobNumber = 0;
this.connected = false;
this.socket = new net.Socket();
};
lpr.prototype.createJob = function(options) {
this.jobNumber++;
return new job(this, options);
};
lpr.prototype.connect = function(cb) {
if (this.connected) {
return cb(new Error('Already connected'));
}
var self = this;
this.socket.on('close', function() {
self.debug('Connection closed');
self.connected = false;
});
this.socket.connect(this.options.port, this.options.ip, function(err) {
if (err) {
return cb(err);
}
self.connected = true;
self.debug('Connected to ' + self.options.ip + ':' + self.options.port);
cb();
});
};
lpr.prototype.disconnect = function() {
this.connected = false;
this.socket.destroy();
};
lpr.prototype._send = function() {
var self = this;
var args = [].slice.call(arguments);
var cmdName = args.shift();
var cmd = CONSTANTS.COMMAND[cmdName];
var cb = args.pop();
var log = "Sending " + cmdName;
var command = Buffer.alloc(1);
command.writeUInt8(cmd.CODE);
var buffers = [command];
cmd.ARGS.forEach(function(argName, i) {
var arg = args.shift();
if (i > 0) {
buffers.push(SP);
}
buffers.push(Buffer.from(arg));
log += " " + argName + ": " + arg;
});
buffers.push(LF);
if (!this.connected) {
return cb(new Error('socket is not connected'));
}
this.debug(log);
var onData = function(data) {
if (['SEND_QUEUE_STATE_SHORT', 'SEND_QUEUE_STATE_LONG'].indexOf(cmdName) === -1) {
self.socket.removeListener('data', onData);
} else {
self.debug('Received: ' + data.toString());
}
self.debug('Received: ' + data.toString('hex'));
if (data.toString('hex') !== '00') {
return cb(new Error('LPD reject command with code ' + data.toString('hex')))
}
cb(null, data);
};
this.socket.on('data', onData);
this.socket.write(Buffer.concat(buffers));
};
lpr.prototype._sendRaw = function(raw, cb) {
var self = this;
var onData = function(data) {
self.socket.removeListener('data', onData);
self.debug('for raw data Received: ' + data.toString('hex'));
cb(null, data);
};
this.socket.on('data', onData);
// End
var end = Buffer.alloc(1);
end.writeUInt8(0);
this.socket.write(Buffer.concat([raw, end]));
};
lpr.prototype.listJobs = function() {
this._send('SEND_QUEUE_STATE_LONG', this.options.queue, this.options.user, function() {});
};
module.exports = lpr;