diff --git a/README.md b/README.md index 7aa521b..c41167b 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,7 @@ string or an object containing: be necessary in a perfect world, but some versions of Windows doesn't like connecting to a server running a different version of the IPP protocol than it self (default: `true`) +- `onerror` - Function. Callback for catching [`http.Server`](https://nodejs.org/api/http.html#http_class_http_server) errors. Useful for catching server initialization errors if there are network or configuration problems. Note that the IPP standard specifies port 631 as the default IPP port, but most IPP clients are fine with connecting to another port. @@ -165,6 +166,14 @@ An array of all jobs handled by the printer. An instance of [`http.Server`](https://nodejs.org/api/http.html#http_class_http_server). +#### `printer.destroy` + +A function to shut down the printer server and bonjour service. + +```js +printer.destroy(); +``` + ### Class: Job A job is a readable stream containing the document to be printed. In diff --git a/lib/bind.js b/lib/bind.js index 3bee4c2..6c1159c 100644 --- a/lib/bind.js +++ b/lib/bind.js @@ -3,6 +3,7 @@ var util = require('util') var os = require('os') var http = require('http') +var serverDestroy = require('server-destroy') var Bonjour = require('bonjour') var ipp = require('ipp-encoder') var debug = require('debug')(require('../package').name) @@ -21,11 +22,34 @@ module.exports = function (printer) { else server.on('listening', onlistening) } else { server = printer.server = http.createServer(onrequest) + server.on('error', onerror) server.listen(printer.port, onlistening) } + // Enable destroy method in http server + serverDestroy(server) + + // Enhance printer object + printer.destroy = destroy + return printer + function onerror (err) { + if (printer.onerror) { + return printer.onerror(err) + } + + throw err + } + + function destroy () { + printer.stop() + bonjour.destroy() + server.destroy() + + debug('Printer server destroyed') + } + function onrequest (req, res) { debug('HTTP request: %s %s', req.method, req.url) diff --git a/lib/printer.js b/lib/printer.js index cd9b8b6..79bdbc3 100644 --- a/lib/printer.js +++ b/lib/printer.js @@ -32,6 +32,9 @@ function Printer (opts) { this.server = opts.server this.fallback = opts.fallback + // Events + this.onerror = opts.onerror + bind(this) } diff --git a/package.json b/package.json index c54967f..8a98860 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "pump": "^1.0.1", "rc": "^1.1.6", "readable-stream": "^2.0.5", + "server-destroy": "^1.0.1", "unique-concat": "^0.2.2" }, "devDependencies": {