63 lines
2.0 KiB
JavaScript
63 lines
2.0 KiB
JavaScript
const PACKETS = {
|
|
DOCUMENT_START: 0,
|
|
DOCUMENT_CHUNK: 1,
|
|
DOCUMENT_END: 2
|
|
};
|
|
|
|
const printDocument = async (data) => {
|
|
const iframe = document.createElement("iframe");
|
|
iframe.style.display = "none";
|
|
document.body.appendChild(iframe);
|
|
|
|
iframe.onload = () => {
|
|
setTimeout(() => {
|
|
iframe.focus();
|
|
iframe.contentWindow.print();
|
|
}, 1);
|
|
};
|
|
|
|
const blob = new Blob([new Uint8Array(data)], { type: "application/pdf" });
|
|
iframe.src = URL.createObjectURL(blob);
|
|
}
|
|
|
|
export default (rfb) => {
|
|
let documentSize = 0;
|
|
let downloadedSize = 0;
|
|
let documentData = [];
|
|
|
|
const processRelayData = (payload) => {
|
|
const array = Array.from(payload);
|
|
const buffer = new Uint8Array(array).buffer;
|
|
const packetData = new DataView(buffer);
|
|
const packetId = packetData.getUint32(0, false);
|
|
|
|
switch (packetId) {
|
|
case PACKETS.DOCUMENT_START:
|
|
documentSize = packetData.getUint32(4, false);
|
|
downloadedSize = 0;
|
|
console.log(`Downloading document for printing (${documentSize}B)`);
|
|
break;
|
|
|
|
case PACKETS.DOCUMENT_CHUNK:
|
|
let chunkSize = packetData.getUint32(4, false);
|
|
let chunkData = new Uint8Array(buffer, 8);
|
|
downloadedSize += chunkSize;
|
|
documentData.push(...chunkData);
|
|
console.log(`Downloading document for printing (${downloadedSize}/${documentSize}B)`);
|
|
break;
|
|
|
|
case PACKETS.DOCUMENT_END:
|
|
console.log(`Downloaded document for printing (${downloadedSize}/${documentSize}B)`);
|
|
printDocument(documentData);
|
|
downloadedSize = 0;
|
|
documentSize = 0;
|
|
break;
|
|
|
|
default:
|
|
console.error(`Unknown packet id: ${packetId}`);
|
|
break;
|
|
}
|
|
}
|
|
|
|
rfb.subscribeUnixRelay("printer", processRelayData);
|
|
} |