Skip to content

API Overrides

Tres Finocchiaro edited this page Mar 21, 2025 · 24 revisions

Compatibility

  • ✅ 2.2 | ✅ 2.1 | ✅ 2.0 | ⛔ 1.9 | ...

Background

QZ Tray 2.1+ uses native promises and an internal sha256 hashing and requires only WebSocket dependency for connection and crypto dependency for signing.

Click to expand QZ Tray 2.0 overrides

QZ Tray 2.0 is bundled with RSVP to provide ECMAScript 6 Promise support. If RSVP is not desired, it can be overridden using qz.api.setPromiseType(...) to avoid ReferenceError: RSVP is not defined or Uncaught TypeError: Cannot read property 'promise' of null. Override examples are provided below.

Promises

  1. Include the new promise library:

    <script type="text/javascript" src="https://rawgit.com/kriskowal/q/v1/q.js"></script>

    or via npm : npm install q

  2. Override Promise with Q using qz.api.setPromiseType(...).

    // Q
    qz.api.setPromiseType(require('q').Promise);
    // RSVP
    qz.api.setPromiseType(require('rsvp').Promise);
    // Bluebird
    qz.api.setPromiseType(resolver => new Promise(resolver));

WebSocket

As of Node 6.5, WebSockets are only available through 3rd party libraries causing Error: WebSocket not supported by this browser.

qz.api.setWebSocketType(require('ws')); // require('websocket').w3cwebsocket

Node Quickstart

Install dependencies:

npm install qz-tray ws

Provide API overrides and start talking to QZ Tray:

var qz = require('qz-tray');
qz.api.setWebSocketType(require('ws'));

qz.websocket.connect()
.then(qz.printers.getDefault)
.then(function(printer) {
   console.log("The default printer is: " + printer);
})
.then(qz.websocket.disconnect)
.then(function() {
   process.exit(0);
})
.catch(function(err) {
   console.error(err);
   process.exit(1);
});

AngularJS Quickstart

This is only for the API overrides. To set up signing, see assets/signing/sign-message.ts.

Install dependencies:

npm install qz-tray

Provide API overrides and start talking to QZ Tray:

import * as qz from 'qz-tray';

qz.websocket.connect()
 .then(qz.printers.getDefault)
 .then(printer => console.log("The default printer is: " + printer))
 .then(qz.websocket.disconnect)
 .catch(err => console.error(err));

Note, Angular 9 and higher will error with the following:

- ERROR in ./node_modules/qz-tray/qz-tray.js
- Module not found: Error: Can't resolve 'path' in 'node_modules/qz-tray'

Add the following entry to your package.json to omit path from AOT compilation:

"browser": { "path": false }

Note, Angular 11 and higher will error with the following:

- Could not find a declaration file for module 'qz-tray'. '/Users/owner/my-app/node_modules/qz-tray/qz-tray.js' implicitly has an 'any' type.

Add a file to src/qz-tray.d.ts with the following content:

declare module 'qz-tray';
QZ Tray 2.0 (continued)

Native Promises

  1. Override RSVP with native Promises using qz.api.setPromiseType(...).
qz.api.setPromiseType(function promise(resolver) { return new Promise(resolver); });

Override SHA256

A hashing algorithm is required for signature validation. Use qz.api.setSha256Type(...) to override the default hashing library and avoid TypeError: _qz.tools.hash is not a function.

Native

Since QZ Tray 2.0.5, the native browser crypto can be used. This will only work with HTTPS pages.

Node 6.5

qz.api.setSha256Type(function(data) {
   return crypto.createHash('sha256').update(data).digest('hex');
});
  • 2.0.1 and older only. Newer versions include this logic by default.

Node 4.5

  • Requires sha.js
var createHash = require('sha.js');
qz.api.setSha256Type(function(data) {
    return createHash('sha256').update(data).digest('hex');
});
npm install js-sha256
import { sha256 } from 'js-sha256';                       // QZ Tray 2.0 and older

qz.api.setSha256Type(data => sha256(data));               // QZ Tray 2.0 and older
qz.api.setPromiseType(resolver => new Promise(resolver)); // QZ Tray 2.0 and older